package com.fbinggun.fbinggunutil;


import com.fbinggun.fbinggunutil.API.JavaUtil;
import com.fbinggun.fbinggunutil.API.PApiUtil;
import com.fbinggun.fbinggunutil.API.PluginUtil;
import com.fbinggun.fbinggunutil.plugin.FgiveUtil;
import com.fbinggun.fbinggunutil.plugin.ItemsAdderUtil;
import com.fbinggun.fbinggunutil.utilclass.Variable;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta;

import java.util.ArrayList;
import java.util.List;

/**
 * 物品处理常用方法
 */
@Deprecated
public class ItemUtil {



    /**
     * 将序列化值转物品 （不包含NBT）
     * @param str 物品序列号值
     * */
    @Deprecated
    public  static  ItemStack toItemStack(String str){
        String name = null;
        String type = "Stone";
        List<String> lores = new ArrayList<>();
        Material material = null;
        for(String args:str.split("\n")){
            if(args.startsWith("Name")){
                name=args.replace("Name:","");
            }
            if(args.startsWith("Type")){
                type=args.replace("Type:","");
                if(type!=null){
                    material= Material.valueOf(type);
                }
            }
            if(args.startsWith("Lore")){
                String lore=args.replace("Lore:","");
                lores= com.fbinggun.fbinggunutil.API.JavaUtil.toList(lore,"%d%");
            }
        }
        if(material!=null) {
            ItemStack itemStack = new ItemStack(material);
            ItemMeta itemMeta = itemStack.getItemMeta();
            if(name!=null){
                itemMeta.setDisplayName(name);
            }
            if(lores!=null&&lores.size()!=0){
                itemMeta.setLore(lores);
            }
            itemStack.setItemMeta(itemMeta);
            return itemStack;
        }
        return null;
    }


    /**
     * 将物品转 String值 不包含NBT
     * @param itemStack 物品堆*/
    //物品转String
    @Deprecated
    public  static  String toString(ItemStack itemStack){
        String name = "";
        String type = itemStack.getType().toString();
        String lore= "";
        if(itemStack.getItemMeta()!=null){
            if(itemStack.getItemMeta().getLore()!=null){
                lore= com.fbinggun.fbinggunutil.API.JavaUtil.listToString(itemStack.getItemMeta().getLore(),"%d%");
            }
            if(itemStack.getItemMeta().getDisplayName()!=null){
                name=itemStack.getItemMeta().getDisplayName();
            }

        }
        String str = "Name:"+name+"\nType:"+type+"\nLore:"+lore;
        return str;
    }


    /**
     * 获取手中物品数量
     * @param p 玩家
     * @return 数量
     */
    public static int getHandAmount(Player p) {
        if(p.getItemInHand().getType()==Material.AIR) {
            return 0;
        }
        if(p.getItemInHand().getType()==null) {
            return 0;
        }
        return p.getItemInHand().getAmount();
    }


    /**
     * 获取手中物品在背包中的数量
     * @param p 玩家
     * @return 数量
     */
    //获取手中物品在背包中的数量
    public static int getInvAmount(Player p) {
        int v =0;
        for(ItemStack item:p.getInventory().getContents()){
            if(item==null) {
                continue;
            }
            if(item.getType()==Material.AIR) {
                continue;
            }
            if(getType(item).equals( getType(p.getItemInHand()))) {
                v=v+item.getAmount();
            }
        }
        return v;
    }

    /**
     * 获取物品在背包中的数量
     * @param p 玩家
     * @param type 物品ID
     * @return 数量
     */
    //获取物品在背包中的数量
    public static int getInvAmount(Player p,String type) {
        int v =0;
        for(ItemStack item:p.getInventory().getContents()){
            if(item==null) {
                continue;
            }
            if(item.getType()==Material.AIR) {
                continue;
            }

            if(getType(item).equals(type)) {
                v=v+item.getAmount();
            }
        }
        return v;
    }

    /**
     * 获取物品ID（类型） 兼容ItemAdder 插件
     * @param item 物品堆
     * @return 物品ID
     */
    //获取物品类型
    public static String getType(ItemStack item) {
        if(item==null){
            return null;
        }
        if(com.fbinggun.fbinggunutil.API.PluginUtil.isItemsAdder()){
            return ItemsAdderUtil.getType(item);
        }
        return item.getType().name();
    }

    /**
     * 扣除玩家背包中的物品
     * @param player 玩家
     * @param type 物品ID
     * @param amount 物品数量
     */
    //扣除玩家背包物品
    public static void takeInvItem(Player player,String type,int amount){
        for(ItemStack itemStack:player.getInventory().getContents()){
            if(itemStack==null){
                continue;
            }
            if(getType(itemStack).equalsIgnoreCase(type)){
                if(amount>=itemStack.getAmount()){
                    amount=amount-itemStack.getAmount();
                    itemStack.setAmount(0);
                }else {
                    itemStack.setAmount(itemStack.getAmount()-amount);
                    return;
                }
            }
        }
    }

    /**
     * 扣除玩家背包中的物品
     * @param player 玩家
     * @param item 物品堆
     * @param amount 物品数量
     */
    //扣除玩家背包物品
    //按类型判断
    public static void takeInvItem(Player player,ItemStack item,int amount){
        takeInvItem(player,getType(item),amount);
    }

    /**
     * 判断玩家背包中是否包含足够的物品
     * @param player 玩家
     * @param type 物品id
     * @param amount 数量
     * @return
     */
    //判断玩家背包是否有这个物品 数量足够
    public static boolean isInvItemAmount(Player player,String type,int amount){
        int count =getInvAmount(player,type);
        if(count>=amount){
            return true;
        }else {
            return false;
        }
    }
    /**
     * 判断玩家背包中是否包含足够的物品
     * @param player 玩家
     * @param item 物品堆
     * @param amount 数量
     * @return
     */
    //判断玩家背包是否有这个物品 数量足够
    public static boolean isInvItemAmount(Player player,ItemStack item,int amount){
        return  isInvItemAmount(player,getType(item),amount);
    }

    /**
     * 给予玩家物品 如背包已满则掉落在玩家脚下
     * @param it1 物品堆
     * @param p 玩家
     * @param a 数量
     */
    //给予玩家物品
    public static void givePlayerItem(ItemStack it1, Player p, int a) {
        if (it1 != null) {
            it1.setAmount(a);
            if (p.getInventory().firstEmpty() == -1) {
                p.getLocation().getWorld().dropItem(p.getLocation(), it1);
                p.sendMessage("§c背包已满掉落到了地上");
            } else {
                p.getInventory().addItem(new ItemStack[]{it1});
            }

        }
    }

    /**
     * 给与玩家物品
     * @param it1 物品堆
     * @param p 玩家
     */
    //给予玩家物品
    public static void givePlayerItem(ItemStack it1, Player p) {
        if (it1 != null) {
            if (p.getInventory().firstEmpty() == -1) {
                p.getLocation().getWorld().dropItem(p.getLocation(), it1);
                p.sendMessage("§c背包已满掉落到了地上");
            } else {
                p.getInventory().addItem(new ItemStack[]{it1});
            }

        }
    }

    /**
     * 将物品给与玩家 如果背包已满 不进行丢弃 多余物品删除
     * @param it1 物品
     * @param p 玩家
     */
    public static void givePlayerItemOnDrop(ItemStack it1, Player p) {
        if (it1 != null) {
            if (p.getInventory().firstEmpty() == -1) {
//                p.getLocation().getWorld().dropItem(p.getLocation(), it1);
//                p.sendMessage("§c背包已满掉落到了地上");
            } else {
                p.getInventory().addItem(new ItemStack[]{it1});
            }

        }
    }

    /**
     * 获取物品显示名
     * @param itemStack 物品
     * @return  物品名 如无显示名 返回物品ID （可能是ItemAdder的物品ID)
     */
    //获取物品显示名
    public static  String getDisplayName(ItemStack itemStack){
        if(itemStack.getItemMeta()==null){
            return FBinggunUtil.plugin.getItemLang(itemStack);
        }
        String name =itemStack.getItemMeta().getDisplayName();
        if(name==null||name.equalsIgnoreCase("")){
            return FBinggunUtil.plugin.getItemLang(itemStack);
        }

        return name;
    }

    /**
     * 通过ID获得物品
     * @param name 物品ID 包含Fgive ItemAdder的物品ID
     * @return 物品
     */
    //通过ID获取物品 支持Fgive ItemAdder
    public static  ItemStack getItem(String name){
        ItemStack itemStack ;
        if(com.fbinggun.fbinggunutil.API.PluginUtil.isItemsAdder()){
            itemStack= ItemsAdderUtil.getItem(name);
            if(itemStack!=null){
                return itemStack;
            }
        }
        if(com.fbinggun.fbinggunutil.API.PluginUtil.isFgive()){
            itemStack=  FgiveUtil.getItem(name);
            if(itemStack!=null){
                return itemStack;
            }
        }
        if(name.equals("PLAYER_HEAD")){
            return new ItemStack(Material.valueOf("PLAYER_HEAD"));
        }
        return new ItemStack(Material.getMaterial(name));
    }

    /**
     * 为物品添加lore
     * @param player 玩家 用于替换lore中的变量
     * @param itemStack 物品堆
     * @param str 要添加的lore
     * @return 物品堆
     */
    //为物品添加 lore 并替换lore中的变量
    public static ItemStack addLore(Player player,ItemStack itemStack,List<String> str){
        ItemMeta meta =itemStack.getItemMeta();
        List<String> lore = new ArrayList<>();
        if(meta!=null&&meta.getLore()!=null){
            lore=meta.getLore();
        }
        lore.addAll(com.fbinggun.fbinggunutil.API.PApiUtil.setPlaceholdersList(player,str));
        meta.setLore(lore);
        itemStack.setItemMeta(meta) ;
        return itemStack;
    }

    /**
     * 为物品添加lore
     * @param itemStack 物品堆
     * @param str 要添加的lore
     * @return 物品堆
     */
    //为物品添加 lore
    public static ItemStack addLore(ItemStack itemStack,List<String> str){
        ItemMeta meta =itemStack.getItemMeta();
        List<String> lore = new ArrayList<>();
        if(meta!=null&&meta.getLore()!=null){
            lore=meta.getLore();
        }
        lore.addAll(str);
        meta.setLore(lore);
        itemStack.setItemMeta(meta) ;
        return itemStack;
    }
    /**
     * 为物品添加lore
     * @param itemStack 物品堆
     * @param str 要添加的lore
     * @return 物品堆
     */
    //为物品添加 lore
    public static ItemStack addLore(ItemStack itemStack,String str){
        ItemMeta meta =itemStack.getItemMeta();
        List<String> lore = new ArrayList<>();
        if(meta!=null&&meta.getLore()!=null){
            lore=meta.getLore();
        }
        lore.add(str);
        meta.setLore(lore);
        itemStack.setItemMeta(meta) ;
        return itemStack;
    }

    /**
     * 为物品添加lore
     * @param player 玩家 用于替换lore中的变量
     * @param itemStack 物品堆
     * @param str 要添加的lore
     * @return 物品堆
     */
    public static ItemStack addLore(ItemStack itemStack,String str,Player player){
        if(PluginUtil.isPlaceholderAPI()){
            str= PApiUtil.setPlaceholders(player,str);
        }
        return addLore(itemStack,str);
    }

    /**
     * 通过配置文件 获得物品
     * 例如:
     * Item:
     *  Type: STONE #物品ID
     *  Name: "&a物品显示名"
     *  Lore:
     *  - "&aLore 信息"
     *  Amount: 数量
     *  Head: "Player_Name" #如果物品类型是头颅 设置头颅的显示皮肤 可用变量%Player_Name%
     * @param config 配置文件
     * @return 物品堆
     */
    public static ItemStack getItemStack(ConfigurationSection config){
        return getItemStack(config,null);
    }

    /**
     * 通过配置文件 获得物品
     * @param config 配置文件
     * @param variable 替换变量 new Variable("变量","替换的值") 代表将 文本中的 "变量" 替换成对应值
     * @return 物品堆
     */
    //通过配置文件获取物品 Variable 变量替换
    public static ItemStack getItemStack(ConfigurationSection config, Variable... variable){
        ItemStack itemStack = getItem(config.getString("Type")).clone();
        String name = config.getString("Name");
        List<String> lore =config.getStringList("Lore");
        int amount = config.getInt("Amount",1);
        ItemMeta meta =itemStack.getItemMeta();
        if(meta instanceof SkullMeta){
            String skin = config.getString("Head");
            if(skin!=null){
                SkullMeta skullMeta= (SkullMeta) meta;
                skullMeta.setOwner(skin);
                meta=skullMeta;
            }
        }
        if(name!=null) {
            meta.setDisplayName(com.fbinggun.fbinggunutil.API.JavaUtil.replaceColor(name,variable));
        }
        if(lore!=null) {
            List<String> itemLore =new ArrayList<>();
            if(meta!=null&&meta.getLore()!=null){
                itemLore=meta.getLore();
            }
            itemLore.addAll(lore);
            meta.setLore(JavaUtil.replaceColor(itemLore,variable));
        }
        itemStack.setAmount(amount);
        itemStack.setItemMeta(meta);
        return itemStack;
    }




}
